gskrenderer: Store the GL context
authorBenjamin Otte <otte@redhat.com>
Wed, 23 Nov 2016 05:54:03 +0000 (06:54 +0100)
committerBenjamin Otte <otte@redhat.com>
Mon, 5 Dec 2016 14:02:47 +0000 (15:02 +0100)
And use it to create the drawing context with it.

Note that this doesn't yet have any effect and is all infrastructure
preparation work.

docs/reference/gsk/gsk4-sections.txt
gsk/gskglrenderer.c
gsk/gskrenderer.c
gsk/gskrenderer.h
gsk/gskrendererprivate.h
gtk/gtkwidget.c

index bc757b568e31094cf0e689fcfec69b1437bc972f..ec761a280e3825bdbeb43009af9631c7dbb349d9 100644 (file)
@@ -10,6 +10,7 @@ gsk_renderer_get_display
 gsk_renderer_realize
 gsk_renderer_unrealize
 gsk_renderer_create_render_node
+gsk_renderer_get_gl_context
 gsk_renderer_render
 <SUBSECTION Standard>
 GSK_IS_RENDERER
index 853f690149185cdfb96497a6bfbe24f2c96f6778..bb1f52bea4d4c602eb2cc598a9074486a00178ec 100644 (file)
@@ -310,6 +310,8 @@ gsk_gl_renderer_realize (GskRenderer  *renderer,
   if (!gsk_gl_renderer_create_programs (self, error))
     return FALSE;
 
+  gsk_renderer_set_gl_context (renderer, self->gl_context);
+
   return TRUE;
 }
 
@@ -336,6 +338,8 @@ gsk_gl_renderer_unrealize (GskRenderer *renderer)
 
   if (self->gl_context == gdk_gl_context_get_current ())
     gdk_gl_context_clear_current ();
+
+  gsk_renderer_set_gl_context (renderer, NULL);
 }
 
 static void
index 86e262ca3df2b95d9c92cca6b1bcca92cf7a8abe..173756ff6d399719fd7f4a86505fb6f80ee8f5a0 100644 (file)
@@ -67,6 +67,7 @@ typedef struct
   GskScalingFilter mag_filter;
 
   GdkWindow *window;
+  GdkGLContext *gl_context;
   GdkDrawingContext *drawing_context;
   GskRenderNode *root_node;
   GdkDisplay *display;
@@ -580,6 +581,8 @@ gsk_renderer_unrealize (GskRenderer *renderer)
 
   GSK_RENDERER_GET_CLASS (renderer)->unrealize (renderer);
 
+  g_warn_if_fail (priv->gl_context == NULL);
+
   priv->is_realized = FALSE;
 }
 
@@ -587,7 +590,9 @@ gsk_renderer_unrealize (GskRenderer *renderer)
  * gsk_renderer_render:
  * @renderer: a #GskRenderer
  * @root: a #GskRenderNode
- * @context: a #GdkDrawingContext
+ * @context: a #GdkDrawingContext using the context returned by
+ *     gsk_renderer_get_gl_context() or %NULL if the renderer was created
+ *     via gsk_renderer_create_fallback().
  *
  * Renders the scene graph, described by a tree of #GskRenderNode instances,
  * using the given #GdkDrawingContext.
@@ -821,6 +826,32 @@ gsk_renderer_get_cairo_context (GskRenderer *renderer)
   return priv->cairo_context;
 }
 
+void
+gsk_renderer_set_gl_context (GskRenderer  *renderer,
+                             GdkGLContext *context)
+{
+  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
+
+  g_set_object (&priv->gl_context, context);
+}
+
+/**
+ * gsk_renderer_get_gl_context:
+ * @renderer: a #GskRenderer
+ *
+ * Returns the GL context used by @renderer. The only use for using this
+ * function is to pass the result to gdk_window_begin_draw_frame().
+ *
+ * Returns: The GL context to use for creating drawing contexts
+ **/
+GdkGLContext *
+gsk_renderer_get_gl_context (GskRenderer *renderer)
+{
+  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
+
+  return priv->gl_context;
+}
+
 /**
  * gsk_renderer_create_fallback:
  * @renderer: a #GskRenderer
index 722259f4b9e36343ab4c84b7bb8c06960a3dba79..507beb304922c150457b72adcba59fdeb2194e9b 100644 (file)
@@ -76,6 +76,8 @@ GskRenderer *           gsk_renderer_create_fallback            (GskRenderer
                                                                  const graphene_rect_t   *viewport,
                                                                  cairo_t                 *cr);
 
+GDK_AVAILABLE_IN_3_90
+GdkGLContext *          gsk_renderer_get_gl_context             (GskRenderer             *renderer);
 GDK_AVAILABLE_IN_3_90
 void                    gsk_renderer_render                     (GskRenderer             *renderer,
                                                                  GskRenderNode           *root,
index eae84124450dc8e0c372a675ddf49d66fce183b9..86711609929bd05310d440322d6cda428338bf64 100644 (file)
@@ -53,6 +53,8 @@ struct _GskRendererClass
 
 gboolean gsk_renderer_is_realized (GskRenderer *renderer);
 
+void                    gsk_renderer_set_gl_context             (GskRenderer    *renderer,
+                                                                 GdkGLContext   *context);
 GskRenderNode *         gsk_renderer_get_root_node              (GskRenderer    *renderer);
 GdkDrawingContext *     gsk_renderer_get_drawing_context        (GskRenderer    *renderer);
 cairo_t *               gsk_renderer_get_cairo_context          (GskRenderer    *renderer);
index 641726dcb6364234bb03a350dd8ed34e50290d33..d9eab4ead18c0ad474606d384cd00b8d2a710a40 100644 (file)
@@ -15686,18 +15686,22 @@ gtk_widget_render (GtkWidget            *widget,
   if (renderer == NULL)
     return;
 
-  gtk_snapshot_init (&snapshot, renderer, region);
+  context = gdk_window_begin_draw_frame (window,
+                                         gsk_renderer_get_gl_context (renderer),
+                                         region);
+
+  gtk_snapshot_init (&snapshot,
+                     renderer,
+                     gdk_drawing_context_get_clip (context));
   gtk_widget_snapshot (widget, &snapshot);
   root = gtk_snapshot_finish (&snapshot);
-  if (root == NULL)
-    return;
-
-  gtk_inspector_record_render (widget, renderer, window, region, root);
-
-  context = gdk_window_begin_draw_frame (window, NULL, region);
+  if (root != NULL)
+    {
+      gtk_inspector_record_render (widget, renderer, window, region, root);
 
-  gsk_renderer_render (renderer, root, context);
-  gsk_render_node_unref (root);
+      gsk_renderer_render (renderer, root, context);
+      gsk_render_node_unref (root);
+    }
 
   gdk_window_end_draw_frame (window, context);
 }